package com.gitee.taotaojs.mybootsuper.service;

import com.gitee.taotaojs.mybootsuper.bean.BaseBean;
import com.gitee.taotaojs.mybootsuper.mapper.MySqlBuild;
import org.apache.ibatis.jdbc.SQL;

import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @author TaoTaojs
 * @date 2020/7/14 2:33 PM
 * <p>Description</p>
 * <h1>通用service接口</h1>
 * <h2>简介</h2>
 * 通用service接口
 * <h3>主要功能：</h3>
 * <ol>
 *     <li>统一接口规则</li>
 * </ol>
 * 关联类:
 * 参考链接：
 * History: <br/>
 * <author>        <time>                      <version>          <desc>
 * TaoTaojs        2020/7/14 2:33 PM                V1.0          新建，统一接口规则
 */
public interface IMyComService<T extends BaseBean> {

    /**
     * 使用sql查询
     * @param sql  sql字符串
     * @return 数据列表
     */
    List<T> findBySql(String sql);
    @SuppressWarnings("checkstyle:MissingJavadocMethod")
    List<T> findBySql(SQL sql);

    /**
     * 使用sql更新
     * @param sql  sql字符串
     * @return 受影响条数
     */
    Integer updateBySql(SQL sql);
    @SuppressWarnings("checkstyle:MissingJavadocMethod")
    Integer updateBySql(String sql);

    /**
     * 使用sql新增
     * @param sql  sql字符串
     * @return 主键值
     */
    Integer insertBySql(SQL sql);
    @SuppressWarnings("checkstyle:MissingJavadocMethod")
    Integer insertBySql(String sql);

    /**
     * 使用sql删除
     * @param sql  sql字符串
     * @return 受影响条数
     */
    Integer deleteBySql(SQL sql);
    @SuppressWarnings("checkstyle:MissingJavadocMethod")
    Integer deleteBySql(String sql);

    /**
     * 查询所有数据
     * @return 所有数据
     */
    List<T> findAll();

    /**
     * 根据id查询出对应的对象
     * @param id 主键
     * @return 单独对象
     */
    T findById(Object id);

    /**
     * 如果存在id就更新，如果不存在就插入(不更新空值)
     * @param entity 对象
     * @return 条件查询到的对象
     */
    T addOrUpdateObject(T entity);
    @SuppressWarnings("checkstyle:MissingJavadocMethod")
    T addOrUpdateObject(T entity, boolean upNull);

    /**
     * 删除单个对象
     * @param entity 实体对象
     * @return 受影响条数
     */
    int deleteObject(T entity);

    /**
     * 根据主键删除对象
     * @param id 主键
     * @return 受影响条数
     */
    int deleteObject(Object id);

    /**
     * 假删除单个对象
     * @param entity 实体对象
     * @return 受影响条数
     */
    Integer updateByDeleteObject(T entity);

    /**
     * 根据对象查询数据
     * @param entity 实体对象
     * @return 对象列表
     */
    List<T> findObjectList(T entity);

    /**
     * 根据对象查询数据
     * @param entity 实体对象
     * @return 实体对象
     */
    T findObject(T entity);

    /**
     * 根据对象查询数据
     * @param sql sql生成
     * @return 实体对象
     */
    List<T> findObject(MySqlBuild<T> sql);

//    ========================
//    ========================
//    ========================
    /**
     * 批量插入方法
     * @param list 插入集合
     * @return 插入条数
     */
    Integer batchInsertObject(List<T> list);
    @SuppressWarnings("checkstyle:MissingJavadocMethod")
    Integer batchInsertObject(List<T> list, T baseBean);


    /**
     * 批量删除方法
     * @param list 删除集合
     * @return 删除成功条数
     */
    Integer batchDeleteObject(List<T> list);
    @SuppressWarnings("checkstyle:MissingJavadocMethod")
    Integer batchDeleteObject(List<T> list, T baseBean);

    /**
     * 批量更新方法
     * @param list 更新集合
     * @return 更新成功条数
     */
    Integer batchUpdateObject(List<T> list);

    /**
     * 批量假删除
     * @param list 假删除列表
     * @return 成功假删除的条数
     */
    Integer batchUpdateByDeleteObject(List<T> list);

    /**
     * 全部执行批量操作
     * @param list 更新集合
     * @param listVO 新增集合
     * @param listDb 删除集合
     */
    void batchAll(List<T> list, List<T> listVO, List<T> listDb);

    //    ========================
    //    ========================
    //    ========================

    /**
     * 根据id列表查询
     * @param ids id列表
     * @return 数据集合
     */
    List<T> findByIds(Collection<Integer> ids);

    /**
     * 根据多条件查找
     * @param mysql 复杂mysql对象
     * @return 数据列表
     */
    List<T> findByObjList(MySqlBuild<T> mysql);

    /**
     * 根据id列表查询数据，并返回主键为key的map对象
     * @param ids id列表
     * @return 数据集合Map
     */
    Map<Integer, T> findByObjMap(Collection<Integer> ids);
    @SuppressWarnings("checkstyle:MissingJavadocMethod")
    Map<Integer, T> findByObjMap(MySqlBuild<T> mysql);

    /**
     * 使用复杂mysql对象查询数据，并将数据整理成指定key的Map对象
     * @param mysql 复杂mysql对象
     * @param key key对于属性名称
     * @param <K> key泛型
     * @return 以key为key指的Map对象
     */
    <K> Map<K, T> findObjMap(MySqlBuild<T> mysql, String key);

    /**
     * 时间段查询
     * @param startDate 开始时间
     * @param stopDate 结束时间
     * @return 数据集合
     */
    List<T> findByStartAndStopDate(Date startDate, Date stopDate);
    @SuppressWarnings("checkstyle:MissingJavadocMethod")
    List<T> findByStartAndStopDate(Date startDate, Date stopDate, String dateColumn);

}
